package com.wenmingliang.demo2.com.wenmingliang.demo1;

import java.util.*;

public class ComputeNum {

    public static String countElement(String param) {

        StringBuilder ans = new StringBuilder();
        HashMap<String, Integer> element = new HashMap<>(16);
        List<String> lst = new ArrayList<>();
        List<Integer> lstNum = new ArrayList<>();
        Stack<Integer> s = new Stack<>();
        for (int i = 0; i < param.length(); ++i) {
            if (param.charAt(i) >= 'A' && param.charAt(i) <= 'Z') {
                int tmp = i;
                ++i;
                while (i < param.length() && (param.charAt(i) <= 'z' && param.charAt(i) >= 'a')) {
                    ++i;
                }
                String str = param.substring(tmp, i);
                if (!element.containsKey(str)) {
                    element.put(str, 0);
                }
                lst.add(str);
                if (i < param.length() && (param.charAt(i) >= '0' && param.charAt(i) <= '9')) {
                    int sum = 0;
                    while (i < param.length() && (param.charAt(i) >= '0' && param.charAt(i) <= '9')) {

                        sum = sum * 10 + param.charAt(i) - '0';
                        ++i;
                    }
                    Integer value = element.get(str);
                    element.put(str, value + sum);
                    lstNum.add(sum);
                } else {
                    Integer value = element.get(str);
                    element.put(str, value + 1);
                    lstNum.add(1);
                }
            } else if (param.charAt(i) == '(') {
                s.push(lst.size());
            } else if (param.charAt(i) == ')') {
                ++i;
                int sum;
                if (i < param.length() && (param.charAt(i) >= '0' && param.charAt(i) <= '9')) {
                    sum = 0;
                    while (i < param.length() && (param.charAt(i) >= '0' && param.charAt(i) <= '9')) {
                        sum = sum * 10 + param.charAt(i) - '0';
                        ++i;
                    }
                } else {
                    continue;
                }
                sum--;
                for (int j = s.pop(); j < lst.size(); ++j) {
                    Integer value = element.get(lst.get(j));
                    element.put(lst.get(j), value + sum * lstNum.get(j));
                    Integer li = lstNum.get(j);
                    li = li + sum * li;
                    lstNum.set(j, li);
                }
                --i;
            }
        }
        for (int i = 0; i < lst.size(); ++i) {
            if (element.containsKey(lst.get(i))) {
                Integer value = element.get(lst.get(i));
                ans.append(lst.get(i) + value);
                element.remove(lst.get(i));
            }
        }
        return ans.toString();

    }


}
